package com.lvhr.rpc.fault.retry;

import com.lvhr.rpc.spi.SpiLoader;

import java.util.concurrent.ConcurrentHashMap;

public class RetryStrategyFactory {


    // 单例实例缓存（Key: 负载均衡器类型, Value: 负载均衡器实例）
    private static final ConcurrentHashMap<String, RetryStrategy> INSTANCE_CACHE = new ConcurrentHashMap<>();

    // 默认重试
    private static final String DEFAULT_RETRY_STRATEGY = "no";


    /**
     * 获取重试器类型实例（懒加载 + 线程安全）
     *
     * @param key 重试器类型
     * @return 重试器类型实例
     * @throws IllegalArgumentException 类型不存在时抛出
     */
    public static RetryStrategy getInstance(String key) {
        // 参数校验
        if (key == null || key.isEmpty()) {
            key = DEFAULT_RETRY_STRATEGY;
        }

        // 双重校验锁实现懒加载
        return INSTANCE_CACHE.computeIfAbsent(key, t -> {
            synchronized (RetryStrategyFactory.class) {
                // 再次检查防止其他线程已创建
                if (INSTANCE_CACHE.containsKey(t)) {
                    return INSTANCE_CACHE.get(t);
                }

                // 通过 SPI 加载实例
                RetryStrategy instance = SpiLoader.getInstance(RetryStrategy.class, t);
                if (instance == null) {
                    throw new IllegalArgumentException("Unsupported RetryStrategy  : " + t);
                }
                return instance;
            }
        });
    }

    /**
     * 获取默认重试器类型实例
     */
    public static RetryStrategy getDefaultInstance() {
        return getInstance(DEFAULT_RETRY_STRATEGY);
    }


}
